package com.example.springboot.interceptor;

import com.example.springboot.init.InterceptorConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 自定义拦截器
 * <p> 实现 HandlerInterceptor 接口
 * <p> 需要通过 WebMvcConfigurer 注册
 * <p> 通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录 等
 * <p>
 *
 * @author Zhang.Z
 * @version 2025-09-20
 *
 * @see InterceptorConfig
 */
public class CustomInterceptor implements HandlerInterceptor {

    private static final Logger LOGGER = LoggerFactory.getLogger(CustomInterceptor.class);

    /**
     * 该方法会在Controller方法执行前，其返回值表示是否知道如何写一个接口。
     * <p> 当其返回值为 true 时，表示继续向下执行；
     * <p> 当其返回值为 false 时，会中断后续的所有操作（包括调用下一个拦截器和控制器类中的方法执行等）
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        long start = System.currentTimeMillis();
        request.setAttribute("startTime", start);

        String servletPath = request.getServletPath();
        String requestURI = request.getRequestURI();
        LOGGER.info("custom interceptor  path = {},uri = {}", servletPath, requestURI);
        //代码...

        return true; // 继续执行
    }

    /**
     * 在Controller方法执行后，且解析视图之前
     * <p> 可以通过此方法对请求域中的模型和视图做出进一步的修改
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println(">>> postHandle: Controller 执行完毕");
    }


    /**
     * 整个请求完成后（视图渲染后）。
     * <p> 可以通过此方法实现一些资源清理、记录日志、异常处理等工作。
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        long start = (Long) request.getAttribute("startTime");
        long end = System.currentTimeMillis();
        System.out.println(">>> afterCompletion: 请求耗时=" + (end - start) + "ms");
    }
}
